function fn(a: string | number) {
    // a.substring(1,2) // 类型“number”上不存在属性“substring”。
    // (<string> a).substring(1,2) // 有风险
    if (typeof a === 'string') {
        a.substring(1);
    } else {
        a.toFixed(1)
    }
}

function fn2(a: Date | Array<any>) {
    if (a instanceof Array) {
        a.push(1)
    } else {
        a.getFullYear();
    }
}

interface IA {
    x: string;
    y: string;
}

interface IB {
    a: string;
    b: string;
}

function fn3(arg: IA | IB) {
    if ('x' in arg) {
        // ok
        arg.x
        // error
        
        // arg.b
    } else {
        // ok
        arg.a
        // error
        // arg.x
    }
}

function fn4(elements: Element[] | NodeList | Element) {
    if (canEach(elements)) {
        elements.forEach(elements => {
            elements.className = ''
        })
    } else {
        elements.className = ''
    }
}


/**
 * 添加了 `is` 作为类型谓词
 * @param data 
 * @returns 返回bool
 */
function canEach(data: any): data is Element[] | NodeList {
    return data.forEach !== undefined;
}